{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "1b2b3db3-deff-4335-8f64-aad14f95d7c9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集特征形状: (809, 10), 测试集特征形状: (203, 10)\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# 加载数据\n",
    "data = pd.read_csv('D:/BaiduNetdiskDownload/houseprice.csv')\n",
    "\n",
    "# 确保列名没有空格\n",
    "data.columns = data.columns.str.strip()\n",
    "\n",
    "# 假设目标变量是列 '10'，特征是其余的列\n",
    "X = data.drop(columns=['10'])  # 将目标变量（列 10）从特征中删除\n",
    "y = data['10']  # 将目标变量（列 10）作为目标变量\n",
    "\n",
    "# 分割数据为训练集和测试集（80%训练集，20%测试集）\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "\n",
    "# 输出训练集和测试集的形状\n",
    "print(f\"训练集特征形状: {X_train.shape}, 测试集特征形状: {X_test.shape}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "f82bb0e0-685e-45f9-98a2-432c8a7fb595",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "子集大小: 10.0%, 测试集均方误差: 1.6969\n",
      "子集大小: 30.0%, 测试集均方误差: 1.3939\n",
      "子集大小: 50.0%, 测试集均方误差: 1.4252\n",
      "子集大小: 70.0%, 测试集均方误差: 1.3952\n",
      "子集大小: 100.0%, 测试集均方误差: 1.4318\n"
     ]
    }
   ],
   "source": [
    "\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.impute import SimpleImputer\n",
    "from sklearn.pipeline import make_pipeline\n",
    "\n",
    "# 创建一个简单的线性回归模型\n",
    "model = make_pipeline(SimpleImputer(strategy='mean'), LinearRegression())\n",
    "\n",
    "# 生成不同体量的子集并训练模型\n",
    "subset_sizes = [0.1, 0.3, 0.5, 0.7, 1.0]\n",
    "for size in subset_sizes:\n",
    "    X_train_subset = X_train.sample(frac=size, random_state=42)\n",
    "    y_train_subset = y_train.loc[X_train_subset.index]\n",
    "\n",
    "    # 对 y_train_subset 填充缺失值\n",
    "    y_train_subset = y_train_subset.fillna(y_train_subset.mean())  # 使用均值填充缺失值\n",
    "\n",
    "    # 训练模型\n",
    "    model.fit(X_train_subset, y_train_subset)\n",
    "    y_pred = model.predict(X_test)  # 在测试集上进行预测\n",
    "\n",
    "    # 检查 y_test 和 y_pred 是否包含 NaN，若有则填充\n",
    "    if y_test.isnull().any():\n",
    "        y_test = y_test.fillna(y_test.mean())  # 填充 y_test 中的缺失值\n",
    "\n",
    "    # 如果预测结果 y_pred 中存在 NaN，进行处理\n",
    "    if any(np.isnan(y_pred)):\n",
    "        y_pred = np.nan_to_num(y_pred)  # 将 NaN 转换为 0 或者其他适当的数值\n",
    "\n",
    "    mse = mean_squared_error(y_test, y_pred)  # 计算均方误差\n",
    "    print(f\"子集大小: {size*100}%, 测试集均方误差: {mse:.4f}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "e2f104ef-3e13-42b0-afcf-78b5271d877e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ridge回归模型的测试集均方误差: 1.5637\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn.linear_model import Ridge\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.impute import SimpleImputer\n",
    "\n",
    "# 假设 X_train, X_test, y_train, y_test 已经定义\n",
    "\n",
    "# 使用 SimpleImputer 填补训练集和测试集中的缺失值\n",
    "imputer = SimpleImputer(strategy='mean')  # 使用均值填补缺失值\n",
    "X_train_imputed = imputer.fit_transform(X_train)  # 对训练集填补\n",
    "X_test_imputed = imputer.transform(X_test)  # 对测试集填补\n",
    "\n",
    "# 填补目标变量 y_train 和 y_test 中的缺失值\n",
    "y_imputer = SimpleImputer(strategy='mean')  # 对 y_train 和 y_test 使用均值填补\n",
    "y_train_imputed = y_imputer.fit_transform(np.array(y_train).reshape(-1, 1))  # 转换为 numpy 数组并 reshape\n",
    "y_test_imputed = y_imputer.transform(np.array(y_test).reshape(-1, 1))  # 转换为 numpy 数组并 reshape\n",
    "\n",
    "# 训练 Ridge 回归模型\n",
    "ridge_model = Ridge(alpha=1.0)  # alpha 为正则化强度\n",
    "ridge_model.fit(X_train_imputed, y_train_imputed)  # 使用填补后的 y_train\n",
    "\n",
    "# 在测试集上进行预测并计算 MSE\n",
    "y_pred_ridge = ridge_model.predict(X_test_imputed)\n",
    "mse_ridge = mean_squared_error(y_test_imputed, y_pred_ridge)  # 使用填补后的 y_test\n",
    "print(f\"Ridge回归模型的测试集均方误差: {mse_ridge:.4f}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "82007169-9b2a-45cd-a682-4efcc6cef02c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "留出法交叉验证结果 (验证集MSE): 1.2010\n",
      "K折交叉验证得分: -1.4213\n",
      "自助法交叉验证均方误差: 1.2362\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\anaconda3\\envs\\machinelearning\\lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 22343 (\\N{CJK UNIFIED IDEOGRAPH-5747}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\envs\\machinelearning\\lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 26041 (\\N{CJK UNIFIED IDEOGRAPH-65B9}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\envs\\machinelearning\\lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 35823 (\\N{CJK UNIFIED IDEOGRAPH-8BEF}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\envs\\machinelearning\\lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 24046 (\\N{CJK UNIFIED IDEOGRAPH-5DEE}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\envs\\machinelearning\\lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 23398 (\\N{CJK UNIFIED IDEOGRAPH-5B66}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\envs\\machinelearning\\lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 20064 (\\N{CJK UNIFIED IDEOGRAPH-4E60}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\envs\\machinelearning\\lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 26354 (\\N{CJK UNIFIED IDEOGRAPH-66F2}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\envs\\machinelearning\\lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 32447 (\\N{CJK UNIFIED IDEOGRAPH-7EBF}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\envs\\machinelearning\\lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 35757 (\\N{CJK UNIFIED IDEOGRAPH-8BAD}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\envs\\machinelearning\\lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 32451 (\\N{CJK UNIFIED IDEOGRAPH-7EC3}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\envs\\machinelearning\\lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 38598 (\\N{CJK UNIFIED IDEOGRAPH-96C6}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\envs\\machinelearning\\lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 27604 (\\N{CJK UNIFIED IDEOGRAPH-6BD4}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\envs\\machinelearning\\lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 20363 (\\N{CJK UNIFIED IDEOGRAPH-4F8B}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\envs\\machinelearning\\lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 39564 (\\N{CJK UNIFIED IDEOGRAPH-9A8C}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\envs\\machinelearning\\lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 35777 (\\N{CJK UNIFIED IDEOGRAPH-8BC1}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from sklearn.model_selection import cross_val_score, KFold, train_test_split\n",
    "from sklearn.utils import resample\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.linear_model import Ridge\n",
    "from sklearn.impute import SimpleImputer\n",
    "import numpy as np\n",
    "\n",
    "# 假设数据已经加载并预处理好，X_train 和 y_train 为训练数据\n",
    "# 示例模型：Ridge回归\n",
    "ridge_model = Ridge()\n",
    "\n",
    "# 1. 数据预处理 - 填充缺失值\n",
    "# 使用 SimpleImputer 填充 X_train 和 y_train 中的缺失值\n",
    "imputer_X = SimpleImputer(strategy='mean')  # 使用均值填充 X_train 中的缺失值\n",
    "imputer_X.fit(X_train)\n",
    "X_train_imputed = imputer_X.transform(X_train)\n",
    "\n",
    "imputer_y = SimpleImputer(strategy='mean')  # 使用均值填充 y_train 中的缺失值\n",
    "imputer_y.fit(y_train.values.reshape(-1, 1))  # y_train 转换为二维数组\n",
    "y_train_imputed = imputer_y.transform(y_train.values.reshape(-1, 1))\n",
    "\n",
    "# 2. 留出法交叉验证\n",
    "# 使用 train_test_split 手动分割数据进行留出法验证\n",
    "X_train_split, X_val_split, y_train_split, y_val_split = train_test_split(X_train_imputed, y_train_imputed, test_size=0.2, random_state=42)\n",
    "ridge_model.fit(X_train_split, y_train_split)\n",
    "y_val_pred = ridge_model.predict(X_val_split)\n",
    "mse_val = mean_squared_error(y_val_split, y_val_pred)\n",
    "print(f\"留出法交叉验证结果 (验证集MSE): {mse_val:.4f}\")\n",
    "\n",
    "# 3. K折交叉验证\n",
    "kf = KFold(n_splits=5, shuffle=True, random_state=42)\n",
    "kf_scores = cross_val_score(ridge_model, X_train_imputed, y_train_imputed, cv=kf, scoring='neg_mean_squared_error')\n",
    "print(f\"K折交叉验证得分: {kf_scores.mean():.4f}\")\n",
    "\n",
    "# 4. 自助法交叉验证 (Bootstrap)\n",
    "# 创建自助法的子集\n",
    "n_iterations = 100\n",
    "bootstrap_mse = []\n",
    "for _ in range(n_iterations):\n",
    "    # 随机选择一个自助法子集\n",
    "    X_resampled, y_resampled = resample(X_train_imputed, y_train_imputed, random_state=42)\n",
    "    ridge_model.fit(X_resampled, y_resampled)\n",
    "    y_pred_resampled = ridge_model.predict(X_val_split)  # 用验证集进行预测\n",
    "    mse = mean_squared_error(y_val_split, y_pred_resampled)\n",
    "    bootstrap_mse.append(mse)\n",
    "\n",
    "print(f\"自助法交叉验证均方误差: {np.mean(bootstrap_mse):.4f}\")\n",
    "\n",
    "# 5. 绘制学习曲线 (训练集与验证集MSE随训练样本大小的变化)\n",
    "train_sizes = np.linspace(0.1, 1.0, 10)\n",
    "train_errors, val_errors = [], []\n",
    "\n",
    "for train_size in train_sizes:\n",
    "    # 从训练集随机抽样子集\n",
    "    X_train_subset = X_train_imputed[:int(train_size * len(X_train_imputed))]\n",
    "    y_train_subset = y_train_imputed[:int(train_size * len(y_train_imputed))]\n",
    "    ridge_model.fit(X_train_subset, y_train_subset)\n",
    "    \n",
    "    y_train_pred = ridge_model.predict(X_train_subset)\n",
    "    y_val_pred = ridge_model.predict(X_val_split)\n",
    "    \n",
    "    train_errors.append(mean_squared_error(y_train_subset, y_train_pred))\n",
    "    val_errors.append(mean_squared_error(y_val_split, y_val_pred))\n",
    "\n",
    "# 绘制学习曲线\n",
    "plt.plot(train_sizes, train_errors, label=\"训练集MSE\")\n",
    "plt.plot(train_sizes, val_errors, label=\"验证集MSE\")\n",
    "plt.xlabel(\"训练集比例\")\n",
    "plt.ylabel(\"均方误差\")\n",
    "plt.legend()\n",
    "plt.title(\"学习曲线\")\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "5e66cc97-1bc7-4fa5-9f02-ca4f799e87e2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "使用早停法的均方误差: 2.2643\n"
     ]
    }
   ],
   "source": [
    "from sklearn.impute import SimpleImputer\n",
    "from sklearn.neural_network import MLPRegressor  # Use MLPRegressor for regression\n",
    "from sklearn.pipeline import make_pipeline\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import mean_squared_error  # Use an appropriate metric for regression\n",
    "import numpy as np  # Import numpy\n",
    "\n",
    "# Example data (replace with actual data)\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "\n",
    "# Handling missing values in the target variable using SimpleImputer\n",
    "y_imputer = SimpleImputer(strategy='most_frequent')  # Fill missing values using the most frequent value\n",
    "\n",
    "# Transform the target variable and reshape it to 2D (since SimpleImputer expects 2D input)\n",
    "y_train = y_imputer.fit_transform(np.array(y_train).reshape(-1, 1)).ravel()  # Flatten the array\n",
    "y_test = y_imputer.transform(np.array(y_test).reshape(-1, 1)).ravel()  # Fill missing values in test set\n",
    "\n",
    "# Create a pipeline with SimpleImputer and MLPRegressor (for regression tasks)\n",
    "pipeline = make_pipeline(\n",
    "    SimpleImputer(strategy='mean'),  # Impute missing values in features\n",
    "    MLPRegressor(hidden_layer_sizes=(100,), max_iter=1000, early_stopping=True, validation_fraction=0.1, n_iter_no_change=10, random_state=42)\n",
    ")\n",
    "\n",
    "# Train the model\n",
    "pipeline.fit(X_train, y_train)\n",
    "\n",
    "# Predict on the test set\n",
    "y_pred = pipeline.predict(X_test)\n",
    "\n",
    "# Evaluate using mean squared error for regression tasks\n",
    "mse = mean_squared_error(y_test, y_pred)\n",
    "print(f\"使用早停法的均方误差: {mse:.4f}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dd666f8e-c3f3-4bba-853d-e16aaddd2c57",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
